package org.xlh.springboot304coreannotation;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

import java.util.Date;

/*
 * 当前类被@SpringBootApplication注解修饰，被该注解标注的类是springboot项目的入口类
 * main方法就是整个springboot项目的入口
 * @SpringBootApplication注解是组合了三个注解
 * 	   @SpringBootConfiguration
 * 	   @EnableAutoConfiguration
 *     @ComponentScan
 * 因为有Configuration注解，所以当前类也是一个配置类
 * 因此在springboot主入口配置类当中使用@Bean注解标注方法的话，该方法返回的对象会被纳入IoC容器管理
 *
 * @EnableAutoConfiguration注解开启了自动配置功能
 * 也就是说默认情况下，springboot应用都会默认启用自动配置
 * 自动配置有什么用？
 * 	  所谓的自动配置只要启动，springboot应用就会去类路径中查找class，根据类路径当中的某个类，或某些类，来自动管理bean，不需要我们程序员手动配置
 *    比如：springboot检测到类路径中有sqlSessionFactory，或者在application.properties配置文件中配置了数据源，那么springboot会认为项目中
 * 	  有mybatis框架，于是就会自动配置mybatis框架，
 */
@SpringBootApplication
public class Springboot304CoreAnnotationApplication {

	@Bean
	public Date getDate() {
		return new Date();
	}

	public static void main(String[] args) {
		//从这里开始
		//SpringApplication 【spring应用程序】
		//run 【运行】
		//run方法的第一个参数其实就是配置类，对应的就是以前的配置文件
		//springboot应用程序就是从这个配置类开始，加载所有的bean的
		//Springboot304CoreAnnotationApplication.class 又被称为源
		//SpringApplication.run(Springboot304CoreAnnotationApplication.class, args);

		//通过run方法的返回值，我们可以拿到Spring上下文对象
		//ConfigurableApplicationContext 继承了ApplicationContext
		//因此run方法的返回值就是spring容器
		ConfigurableApplicationContext run = SpringApplication.run(Springboot304CoreAnnotationApplication.class, args);

		//通过bean容器获取bean
		Object sqlSessionFactory = run.getBean("sqlSessionFactory");
		System.out.println(sqlSessionFactory);

		Object transactionManager = run.getBean("transactionManager");
		System.out.println(transactionManager);

		//关闭容器
		run.close();
	}

}
